// ==UserScript== // @name ChatGPT、豆包、Poe 宽屏模式 // @namespace https://greasyfork.org/ // @version 1.2.5 // @description 页面大于1080的屏幕撑开,显示更宽,看的更多,目前适用于Chatgpt、豆包(doubao)ai网站,后续会适配更多网站,欢迎提供网站,谢谢! // @author Await // @match *://chat.openai.com/ // @match *://chat.openai.com/c/* // @match *://chat.openai.com/?* // @match *://poe.com/ // @match *://poe.com/chat/* // @match *://www.doubao.com/chat/* // @license MIT // ==/UserScript== (function () { "use strict"; const desiredMinWidth = 1280; const transitionClass = "await-transition"; const transition_widthClass = "await-transition-width"; const transitionEaseClass = "await-transition-ease"; const maxCount = 10; const hostname = window.location.hostname; const awaits = { await_key: 0, await_MaxWidth: "90rem", await_attributeKey: "await-attribute", await_btnId: "await-btn", await_btnShowTipId: "await-show-tip", await_cacheKey: "await-cache", await_cacheOpenStateKey: "await-cache-open-state", await_cacheCloseStateKey: "await-cache-close-state", await_styleId: "await-max-width", await_cacheThemeId: "theme", await_styleCommon: "await-max-width-common", //doubao await_doubao_aside: "aside", await_doubao_btnClass: "smlyI", await_doubao_promptFormClass: "_1agx", await_doubao_promptShellClass: "veIiy", await_doubao_promptContentClass: "cYhYx", //poe await_poe_aside: "aside", await_poe_menuDeleteClass: "ReactModalPortal", // "ReactModal__Overlay ReactModal__Overlay--after-open Modal_overlay__qLYU1", await_poe_formClass: "ChatMessageInputFooter_footer__1cb8J", await_poe_promptFormToIndexClass: ".ChatHomeMain_container__z8q7_", await_poe_promptFormToIndexBtnClass: ".ChatMessageInputContainer_inputContainer__SQvPA", await_poe_promptBoxClass: "MainColumn_column__z1_q8", await_poe_promptAllMsgClass: ".ChatPageMain_container__1aaCT.ChatPageMain_narrowChatPage__fWwXM", await_poe_themeDark: "dark", await_poe_themeLight: "light", //gpt await_gpt_nav: "nav", await_gpt_navDeleteClass: "absolute", await_gpt_form: "form", await_gpt_msgClass: ".xl\\:max-w-3xl", await_gpt_msgBox: "flex flex-col text-sm dark:bg-gray-800", await_gpt_themeDark: "dark", await_gpt_themeLight: "light", await_gpt_bodyClass: "antialiased", await_gpt_inputClass: "grow", }; !(function () { //判断是来自哪个网站 0等于doubao 1等于poe 2等于gpt if (hostname.indexOf("doubao") > -1) { awaits.await_key = 0; awaits.await_MaxWidth = "100%"; } else if (hostname.indexOf("poe") > -1) { awaits.await_key = 1; awaits.await_MaxWidth = "100%"; } else if (hostname.indexOf("chat.openai") > -1) { awaits.await_key = 2; awaits.await_MaxWidth = "90rem"; } })(); console.log("awaits", awaits, window.location); // try { // var d = document.documentElement, // c = d.classList; // c.remove("light", "dark"); // var e = localStorage.getItem("theme"); // if ("system" === e || (!e && true)) { // var t = "(prefers-color-scheme: dark)", // m = window.matchMedia(t); // if (m.media !== t || m.matches) { // d.style.colorScheme = "dark"; // c.add("dark"); // } else { // d.style.colorScheme = "light"; // c.add("light"); // } // } else if (e) { // c.add(e || ""); // } // if (e === "light" || e === "dark") d.style.colorScheme = e; // } catch (e) {} // })(); function set_common_style_edit(e, className) { e.classList.add(className || awaits.await_styleId); } function set_common_style_remove(e, className) { e.classList.remove(className || awaits.await_styleId); } function setCache(key, value) { localStorage.setItem(key, value); } function getCache(key) { return localStorage.getItem(key); } function getByClass(className) { const func = function (name) { return document.getElementsByClassName(name); }; return gets(func, className); } function getQuery(name) { const func = function (names) { return document.querySelector(names); }; return gets(func, name); } function getById(id) { const func = function (ids) { return document.getElementById(ids); }; return gets(func, id); } function gets(fun, name, count = 0) { const btn = fun(name); if (!btn) { if (count > maxCount) { return null; //防止死循环 } setTimeout(function () { return gets(fun, name, count + 1); }, 1000); } return btn; } function debounce(fn, delay, immediate = false) { let timer = null; let isInvoke = false; const _debounce = function (...args) { return new Promise((resolve, reject) => { if (timer) clearTimeout(timer); if (immediate && !isInvoke) { const result = fn.apply(this, args); resolve(result); isInvoke = true; } else { timer = setTimeout(() => { const result = fn.apply(this, args); resolve(result); isInvoke = false; timer = null; }, delay); } }); }; _debounce.cancel = function () { if (timer) clearTimeout(timer); timer = null; isInvoke = false; }; return _debounce; } function mutationObserverRemoveNodesListener(el, className, fun) { const observer = new MutationObserver((mutations, observe) => { mutations.forEach(function (mutation) { if (!document.contains(el)) { observe.disconnect(); return; } if (mutation.type === "childList") { mutation.removedNodes.forEach((node) => { if (node.className && node.className.indexOf(className) > -1) { fun.apply(this); } }); } }); }); observer.observe(document.body, { // attributes: true, childList: true, }); } function set_style_remove(el, className, isTran = true) { if (isTran && !el.classList.contains(transitionClass)) { el.classList.add(transitionClass); } // el.style.transition = "max-width 1s"; // setTimeout(function () { // el.style.transition = ""; // }, 1000); switch (awaits.await_key) { case 0: case 1: case 2: set_common_style_remove(el, className); break; default: break; } } function set_style_edit(el, className, isTran = true) { if (isTran && !el.classList.contains(transitionClass)) { el.classList.add(transitionClass); } // setTimeout(() => { // el.classList.remove(transitionClass); // }, 1000); switch (awaits.await_key) { case 0: case 1: case 2: set_common_style_edit(el, className); break; default: break; } } function set_style() { const style = document.createElement("style"); style.innerHTML = ` .${awaits.await_styleCommon} {width: ${awaits.await_MaxWidth} !important;} .${awaits.await_styleId} {max-width: ${awaits.await_MaxWidth} !important;} .${transitionClass}{transition: max-width 1s ease-in-out !important;} .${transition_widthClass}{transition: width 1s ease-in-out !important;} .${transitionEaseClass}{transition: width 0.5s ease-in-out;} .${transitionEaseClass}.active {transition: width 0.5s ease-in-out;} `; document.head.appendChild(style); } function set_body_see_toKey() { switch (awaits.await_key) { case 0: break; case 1: break; case 2: // set_gpt_body_s(); break; default: break; } } function set_btn_add(tt = false, count = 0) { const promptTextarea = get_btn_toKey(awaits.await_key); if (!promptTextarea) { if (!tt) { return; } else { if (count > maxCount) { return; } setTimeout(function () { set_btn_add(tt, count + 1); }, 1000); return; } } if (tt && promptTextarea.hasAttribute(awaits.await_attributeKey)) { setTimeout(() => { set_btn_add(tt, count + 1); }, 100); return; } if (!promptTextarea.hasAttribute(awaits.await_attributeKey)) { //判断promptTextarea中的属性 get_btn_prompt_toKey(promptTextarea); set_btn_promptContent_toKey(); set_theme_toKey(); run_info(); promptTextarea.setAttribute(awaits.await_attributeKey, true); } } function get_btn_toKey(key) { if (key === 0) { return getByClass(awaits.await_doubao_btnClass)[0]; } else if (key === 1) { return getQuery("." + awaits.await_poe_formClass); } else if (key === 2) { return getQuery(`.${awaits.await_gpt_inputClass}:not([class*=' '])`); } } function get_btn_prompt_toKey(e, isFirst = false) { switch (awaits.await_key) { case 0: if (!getById(awaits.await_btnId)) { e.insertAdjacentHTML( "afterbegin", ` ` `
` ); } if (!getById(awaits.await_btnId)) { e.insertAdjacentHTML( "afterend", // `
` `
` ); } break; default: break; } } function set_btn_promptContent_toKey(type = 0) { switch (awaits.await_key) { case 0: set_doubao_btn_msgEdit(); break; case 1: if (type === 1) return set_poe_btn_msgEdit(false); else set_poe_btn_msgEdit(); break; case 2: set_gpt_btn_msgEdit(); break; default: break; } } function set_theme_toKey() { switch (awaits.await_key) { case 1: set_poe_theme_add(); break; case 2: set_gpt_theme_add(); break; default: break; } } function set_btn_prompt_edit(el) { if (el && !el.hasAttribute(awaits.await_attributeKey)) { el.addEventListener("click", function () { setCache( awaits.await_cacheKey, getCache(awaits.await_cacheKey) === awaits.await_cacheOpenStateKey ? awaits.await_cacheCloseStateKey : awaits.await_cacheOpenStateKey ); run_info(true); set_btn_promptContent_toKey(); }); el.setAttribute(awaits.await_attributeKey, true); } } function set_cache_add() { const cache = getCache(awaits.await_cacheKey); if (!cache) { setCache(awaits.await_cacheKey, true); } } function setStyle(cache, el, className = "", isTran = true) { if (cache === awaits.await_cacheOpenStateKey) { set_style_edit(el, className, isTran); } else { set_style_remove(el, className, isTran); } } function set_tip_show() { switch (awaits.await_key) { case 0: break; case 1: break; case 2: set_gpt_show(); break; default: break; } } function set_nav_click() { switch (awaits.await_key) { case 0: set_doubao_nav_click(true); break; case 1: set_poe_nav_click(true); break; case 2: set_gpt_nav_click(true); break; default: break; } } function get_form_toKey(operation) { switch (awaits.await_key) { case 0: set_doubao_form(operation); set_doubao_content(); break; case 1: // if (!operation) return; set_poe_promptBox(operation); break; case 2: get_gpt_form(); set_gpt_form_content(); break; default: break; } } //#region poe function set_poe_nav_click(tt = false, count = 0) { const toggleButton = getQuery(awaits.await_poe_aside); if (!toggleButton) { if (!tt) return; else { if (count > maxCount) { return; } setTimeout(function () { set_poe_nav_click(tt, count + 1); }, 1000); return; } } if (tt && toggleButton.hasAttribute(awaits.await_attributeKey)) { setTimeout(function () { set_poe_nav_click(tt, count + 1); }, 1000); return; } if (!toggleButton.hasAttribute(awaits.await_attributeKey)) { const debounceMenu = debounce( () => { //判断是否主页面 if (window.location.pathname.length < 2) { set_poe_promptIndex(); } else { run_all(true); run_info(true); } }, 1000, false ); mutationObserverRemoveNodesListener( toggleButton, awaits.await_poe_menuDeleteClass, debounceMenu ); // toggleButton.addEventListener("click", function () { // setTimeout(function () { // run_all(true); if (window.location.pathname.length < 2) { setTimeout(() => { set_poe_promptIndex(); }, 800); } run_info(true); // }, 1000); // }); toggleButton.setAttribute(awaits.await_attributeKey, true); } } function set_poe_promptIndex(count = 0) { const promptTextarea = getQuery("." + awaits.await_poe_promptBoxClass); if (!promptTextarea) { if (count > maxCount) { return; } setTimeout(function () { set_poe_promptIndex(count + 1); }, 1000); return; } if (promptTextarea) count = 0; const boxContent = getQuery(awaits.await_poe_promptFormToIndexClass); if (!boxContent) { if (count > maxCount) { return; } setTimeout(function () { set_poe_promptIndex(count + 1); }, 1000); return; } if (boxContent) count = 0; const boxBtn = getQuery(awaits.await_poe_promptFormToIndexBtnClass); if (!boxBtn) { if (count > maxCount) { return; } setTimeout(function () { set_poe_promptIndex(count + 1); }, 1000); return; } if (boxContent && promptTextarea && boxBtn) { const cache = getCache(awaits.await_cacheKey); if (!promptTextarea.classList.contains(transition_widthClass)) { promptTextarea.classList.add(transition_widthClass); } debounce( () => { promptTextarea.style.width = cache === awaits.await_cacheOpenStateKey ? "85%" : ""; }, 100, false )(); get_btn_prompt_toKey(boxBtn, true); const btn = set_btn_promptContent_toKey(1); set_theme_toKey(); if (btn && !btn.hasAttribute(awaits.await_attributeKey)) { btn.addEventListener("click", function () { setCache( awaits.await_cacheKey, getCache(awaits.await_cacheKey) === awaits.await_cacheOpenStateKey ? awaits.await_cacheCloseStateKey : awaits.await_cacheOpenStateKey ); set_poe_promptIndex(); }); btn.setAttribute(awaits.await_attributeKey, true); } } } function set_poe_theme_add() { const cache = getCache(awaits.await_cacheThemeId); const el = getById(awaits.await_btnId + "-" + awaits.await_cacheThemeId); if (!el) return; el.innerHTML = ""; if (cache !== awaits.await_gpt_themeLight) { el.insertAdjacentHTML( "afterbegin", `🌞` ); } else { el.insertAdjacentHTML( "afterbegin", `🌙` ); } set_gpt_textInformation_s(el); set_gpt_textInformation_s( getById( awaits.await_btnId + "-" + cache === awaits.await_poe_themeDark ? awaits.await_poe_themeDark : awaits.await_poe_themeLight ) ); } function set_poe_btn_msgEdit(isAdd = true) { const cache2 = getCache(awaits.await_cacheKey); const btn = getById(awaits.await_btnId); btn.innerHTML = ""; if (cache2 === awaits.await_cacheOpenStateKey) { btn.insertAdjacentHTML( "afterbegin", `📘` ); } else { btn.insertAdjacentHTML( "afterbegin", `📖` ); } if (isAdd) { set_btn_prompt_edit(btn); } return btn; } function set_poe_promptBox(tt = false, count = 0) { const box = getQuery("." + awaits.await_poe_promptBoxClass); if (!box) { if (!tt) return; else { if (count > maxCount) { return; } setTimeout(function () { set_poe_promptBox(tt, count + 1); }, 1000); return; } } if (box) count = 0; const boxContent = getQuery(awaits.await_poe_promptAllMsgClass); if (!boxContent) { if (!tt) return; else { if (count > maxCount) { return; } setTimeout(function () { set_poe_promptBox(tt, count + 1); }, 1000); return; } } if (boxContent && box) { const cache = getCache(awaits.await_cacheKey); setStyle(cache, boxContent); debounce( () => { if (!box.classList.contains(transition_widthClass)) { box.classList.add(transition_widthClass); } setStyle(cache, box, awaits.await_styleCommon); }, 200, false )(); } } //#endregion //#region doubao function set_doubao_form(operation = false) { var elementForm = getByClass(awaits.await_doubao_promptFormClass)[0]; if (!elementForm) { setTimeout(function () { set_doubao_form(operation); }, 1000); return; } if (!elementForm.hasAttribute(awaits.await_attributeKey) || operation) { const cache = getCache(awaits.await_cacheKey); setStyle(cache, elementForm); elementForm.setAttribute(awaits.await_attributeKey, true); } } function set_doubao_content() { var elementForm = getByClass(awaits.await_doubao_promptShellClass)[0]; if (!elementForm || elementForm.length === 0) { setTimeout(function () { set_doubao_content(); }, 1000); return; } if (elementForm.hasAttribute(awaits.await_attributeKey)) { return; } const cache = getCache(awaits.await_cacheKey); setStyle(cache, elementForm); elementForm .querySelectorAll("." + awaits.await_doubao_promptContentClass) .forEach(function (flexDiv) { setStyle(cache, flexDiv); }); var observer = new MutationObserver((mutations) => { mutations.forEach(function (mutation) { if (!document.contains(elementForm)) { observer.disconnect(); return; } mutation.addedNodes.forEach((addedNode) => { if (addedNode instanceof Document || addedNode instanceof Element) { addedNode .querySelectorAll("." + awaits.await_doubao_promptContentClass) .forEach(function (node) { setStyle(cache, node); }); } }); }); }); var config = { childList: true, subtree: true }; observer.observe(document.body, config); } function set_doubao_btn_msgEdit() { const cache2 = getCache(awaits.await_cacheKey); const btn = getById(awaits.await_btnId); btn.innerHTML = ""; if (cache2 === awaits.await_cacheOpenStateKey) { btn.insertAdjacentHTML( "afterbegin", ` 📘 ` ); } else { btn.insertAdjacentHTML( "afterbegin", ` 📖 ` ); } set_btn_prompt_edit(btn); } function set_doubao_nav_click(tt = false, count = 0) { const toggleButton = getQuery(awaits.await_doubao_aside); if (!toggleButton) { if (!tt) return; else { if (count > maxCount) { return; } setTimeout(function () { set_doubao_nav_click(tt, count + 1); }, 1000); return; } } if (tt && toggleButton.hasAttribute(awaits.await_attributeKey)) { setTimeout(function () { set_doubao_nav_click(tt, count + 1); }, 1000); return; } if (!toggleButton.hasAttribute(awaits.await_attributeKey)) { toggleButton.addEventListener("click", function () { setTimeout(function () { run_all(); run_info(); }, 1000); }); toggleButton.setAttribute(awaits.await_attributeKey, true); } } //#endregion //#region gpt function get_gpt_form() { var elementForm = getQuery(awaits.await_gpt_form); if (!elementForm || elementForm.length === 0) { setTimeout(function () { get_gpt_form(); }, 1000); return; } const cache = getCache(awaits.await_cacheKey); if (elementForm.className.indexOf("xl:max-w-3xl") > -1) { setStyle(cache, elementForm); } } function set_gpt_form_content() { var parentElement = document.getElementsByClassName( awaits.await_gpt_msgBox )[0]; if (!parentElement) { setTimeout(function () { set_gpt_form_content(); }, 1000); return; } const cache = getCache(awaits.await_cacheKey); parentElement .querySelectorAll(awaits.await_gpt_msgClass) .forEach(function (flexDiv) { setStyle(cache, flexDiv); }); var observer = new MutationObserver((mutations) => { mutations.forEach(function (mutation) { if (!document.contains(parentElement)) { observer.disconnect(); return; } mutation.addedNodes.forEach(function (addedNode) { if (addedNode instanceof Document || addedNode instanceof Element) { var flexDivList = addedNode.querySelectorAll( awaits.await_gpt_msgClass ); flexDivList.forEach(function (flexDiv) { setStyle(cache, flexDiv); }); } }); }); }); var config = { childList: true, subtree: true }; observer.observe(document.body, config); } function set_gpt_theme_add() { const cache = getCache(awaits.await_cacheThemeId); const el = getById(awaits.await_btnId + "-" + awaits.await_cacheThemeId); if (!el) return; el.innerHTML = ""; if (cache !== awaits.await_gpt_themeLight) { el.insertAdjacentHTML( "afterbegin", `
🌞
` ); } else { el.insertAdjacentHTML( "afterbegin", `
🌙
` ); } set_gpt_textInformation_s(el); set_gpt_textInformation_s( getById( awaits.await_btnId + "-" + cache === awaits.await_gpt_themeDark ? awaits.await_gpt_themeDark : awaits.await_gpt_themeLight ) ); } function set_gpt_btn_msgEdit() { const cache2 = getCache(awaits.await_cacheKey); const btn = getById(awaits.await_btnId); btn.innerHTML = ""; if (cache2 === awaits.await_cacheOpenStateKey) { btn.insertAdjacentHTML( "afterbegin", // `
📘
` // `
// // // 📘
` ); } else { btn.insertAdjacentHTML( "afterbegin", // `
📖
` // `
// // // 📖
` ); } set_btn_prompt_edit(btn); } function set_gpt_textInformation_s(el) { if (el && !el.hasAttribute(awaits.await_attributeKey)) { el.addEventListener("click", function () { const cache = getCache(awaits.await_cacheThemeId); //修改html中的style跟class const html = getQuery("html"); const currentTheme = cache !== awaits.await_gpt_themeLight ? awaits.await_gpt_themeLight : awaits.await_gpt_themeDark; html.className = ""; html.className = currentTheme; html.style.colorScheme = currentTheme; setCache(awaits.await_cacheThemeId, currentTheme); set_gpt_theme_add(); }); el.setAttribute(awaits.await_attributeKey, true); } } function set_gpt_body_s() { const body = getQuery("." + awaits.await_gpt_bodyClass); if (!body) { return; } const observer = new MutationObserver((mutationsList, observer) => { for (const mutation of mutationsList) { if ( mutation.type === "attributes" && mutation.attributeName === "style" ) { const newStyle = body.getAttribute("style"); if (!newStyle) { // set_btn_add(true); } } } }); const config = { attributes: true, attributeFilter: ["style"] }; observer.observe(body, config); } function set_gpt_show() { const toggleButton = getQuery(awaits.await_gpt_nav); if (!toggleButton) { return; } toggleButton.insertAdjacentHTML( "beforeend", `
如果页面宽度未展开,请重新点击此树结构导航栏
或者直接点击我
提示内容十秒后自动消失
` ); const btn = getById(awaits.await_btnShowTipId); if (!btn.hasAttribute(awaits.await_attributeKey)) { btn.addEventListener("click", function () { run_all(); }); setTimeout(function () { btn.remove(); }, 10000); btn.setAttribute(awaits.await_attributeKey, true); } } function set_gpt_nav_click(operation = false, count = 0) { const toggleButton = getQuery(awaits.await_gpt_nav); if (!toggleButton) { if (!operation) { return; } else { if (count > maxCount) { return; } setTimeout(function () { set_gpt_nav_click(operation, count + 1); }, 1000); return; } } if (operation && toggleButton.hasAttribute(awaits.await_attributeKey)) { setTimeout(() => { set_gpt_nav_click(operation, count + 1); }, 100); return; } if (!toggleButton.hasAttribute(awaits.await_attributeKey)) { mutationObserverRemoveNodesListener( toggleButton, awaits.await_gpt_navDeleteClass, () => { run_all(true); set_gpt_nav_click(true); } ); toggleButton.addEventListener("click", function () { setTimeout(function () { run_all(true); set_gpt_nav_click(true); }, 1000); }); toggleButton.setAttribute(awaits.await_attributeKey, true); } } //#endregion function run_all(operation) { set_btn_add(operation); set_theme_toKey(); } function run_info(operation) { get_form_toKey(operation); } window.addEventListener("resize", run_all); window.onload = function () { if (window.innerWidth < desiredMinWidth) { console.log("页面宽度小于1280,不执行脚本"); return; } set_cache_add(); set_style(); // set_tip_show(); set_nav_click(); // set_body_see_toKey(); setTimeout(function () { run_all(); }, 2000); }; })();